%{
    // Eval fields tags
    def fieldsHandler = [:]
    if(_body) {
        _body.setProperty('fieldsHandler', fieldsHandler);
}%
        #{doBody as:'skip' /}
%{
    }
}%

%{ 
	_fields = [] 
	_caller.type.fields*.name.each{fieldName->
		if ( !("_").equals(fieldName[0]) ) {
			_fields.add(fieldName)
		}
	}
}%

<table>
    <thead>
        <tr>
        %{ if(_fields) { }%
            %{ _fields.each() { }%
            <th>
                %{ if(!_sort || _sort.contains(it)) { }%
                <a class="${_caller.orderBy == it ? (_caller.order == 'DESC' ? 'crudSortedDesc' : 'crudSortedAsc') : ''}" href="@{list().remove('page').add('search', params.search).add('orderBy', it).add('order', (_caller.orderBy == it && _caller.order == 'ASC' ? 'DESC' : 'ASC'))}">
                    &{it}
                </a>
                %{ } else { }%
                    &{it}
                %{ } }%
            </th>
            %{ } }%
        %{ } else { }%
            <th>
                <a class="${_caller.order == 'DESC' ? 'crudSortedDesc' : 'crudSortedAsc'}" href="@{list().remove('page').add('search', params.search).add('order', (_caller.order == 'DESC' ? 'ASC' : 'DESC'))}">
                    &{_caller.type.name} 
                </a>
            </th>
            <!-- 
            #{list items:_fields ?: _caller.type.fields*.name, as:'fieldName'}
	            <th>
	            		%{ def field = _caller.type.getField(fieldName)
	            			if ( !("_").equals(field.name[0]) ) 
						 		out.println(field.name)
						 }%
	            </th>
			#{/list}
			 -->
        %{ } }%
        </tr>
    </thead>
    %{ _caller.objects.eachWithIndex() { object, k -> }%
    <tr class="${k % 2 ? 'even' : 'odd'}">
        %{ if(_fields) { }%
            %{ _fields.eachWithIndex() { field, i -> }%
            <td>
                %{ if(fieldsHandler[field]) { }%
                    %{
                        def handler = fieldsHandler[field];
                        handler.setProperty('object', object);
                    }%
                    #{doBody body:handler /}
                    %{
                        handler.setProperty('object', null);
                    }%
                %{ } else { }%
                    %{ if(i == 0) { }%
                        <a href="@{show(object._key())}">${object[field]?.toString()?.escape()?.raw() ?: '(no value)'}</a>
                    %{ } else { }%
                        %{ if(_caller.type.getField(field).type == 'file') { }%
                            %{ if(object[field]) { }%
                                <a class="currentAttachment" href="@{attachment(object.id, field)}">${object[field].filename} (${object[field].get().size().formatSize()})</a>
                             %{ } else { }%
                                
                             %{ } }%
                        %{ } else { }%
                            ${object[field]?.escape()?.raw()}
                        %{ } }%
                    %{ } }%
                %{ } }%
            </td>
            %{ } }%
        %{ } else { }%
            %{ if(fieldsHandler['default']) { }%
                %{
                    def handler = fieldsHandler['default'];
                    handler.setProperty('object', object);
                }%
                #{doBody body:handler /}
            %{ } else { }%
                <td>
                    <a href="@{show(object._key())}">${object.toString()?.escape()?.raw() ?: '(no value)'}</a>
                </td>
                <!-- 
                 #{list items:_fields ?: _caller.type.fields*.name, as:'fieldName'}
		            <th>
		            		%{ def field = _caller.type.getField(fieldName)
		            			if ( !("_").equals(field.name[0]) ) {
							 		out.println(object[field.name]) ;
							 	}
							 }%
		            </th>
				#{/list}
				 -->
            %{ } }%
        %{ } }%
    </tr>
    %{ } }%
</table>
